/*
 * Copyright (c) 2024. hallele, Inc All rights reserved.
 */

package cn.hallele.ms.filecenter.domain.das;

import cn.hallele.infrastructure.metadata.constant.MsgCodeConst;
import cn.hallele.infrastructure.metadata.exception.children.SensitiveException;
import cn.hallele.infrastructure.util.ObjectUtil;
import cn.hallele.ms.filecenter.domain.domain.FileDomain;
import cn.hallele.ms.filecenter.model.cache.FileCache;
import cn.hallele.ms.filecenter.model.entity.FileEntity;
import cn.hallele.ms.infrastructure.core.convertor.das.ModelDas;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * hallele_ms_filecenter
 *
 * @author anle5
 * @since 2024/9/24 0:38
 */
@Slf4j
@Component
public class FileDEDas extends ModelDas<FileCache, FileDomain, FileEntity> {
    protected FileDEDas(FileCache option) {
        super(option);
    }

    /**
     * 保存文件
     *
     * @param fileDomain 文件邻域对象
     * @return 文件邻域对象
     */
    public FileDomain saveOne(FileDomain fileDomain) {
        return revert(this.option.addOne(convert(fileDomain)));
    }

    /**
     * 通过md5查询文件
     *
     * @param md5 md5
     * @return 文件信息
     */
    public FileDomain findByMd5(String md5) {
        return revert(this.option.findByMd5(md5));
    }

    /**
     * 通过文件id查询文件
     *
     * @param id 文件id
     * @return 文件
     */
    public FileDomain findById(Long id) {
        FileEntity file = this.option.findOneById(id);
        if (file == null) {
            log.error("File {} not exist", id);
            throw new SensitiveException(MsgCodeConst.SENSITIVE_ERROR, String.format("File %s not exist", id));
        }
        return revert(file);
    }

    /**
     * 将T转成E
     *
     * @param fileDomain 被转换者
     * @return S 转换后者
     */
    @Override
    protected FileEntity convert(FileDomain fileDomain) {
        return ObjectUtil.map(fileDomain, f -> FileEntity.builder()
                .id(f.getId())
                .filename(f.getFilename())
                .filepath(f.getFilepath())
                .action(f.getAction())
                .url(f.getUrl())
                .md5(f.getMd5())
                .filetype(f.getFiletype())
                .tempUrl(f.getTempUrl())
                .expires(f.getExpires())
                .fileSize(f.getFileSize())
                .initiator(f.getInitiator())
                .createTime(f.getCreateTime())
                .updateTime(f.getUpdateTime())
                .build());
    }

    /**
     * 将E回转陈T
     *
     * @param fileEntity 被回转换者
     * @return S 回转换后者
     */
    @Override
    protected FileDomain revert(FileEntity fileEntity) {
        return ObjectUtil.map(fileEntity, f -> FileDomain.builder()
                .id(f.getId())
                .filename(f.getFilename())
                .filepath(f.getFilepath())
                .action(f.getAction())
                .url(f.getUrl())
                .md5(f.getMd5())
                .filetype(f.getFiletype())
                .tempUrl(f.getTempUrl())
                .expires(f.getExpires())
                .fileSize(f.getFileSize())
                .initiator(f.getInitiator())
                .createTime(f.getCreateTime())
                .updateTime(f.getUpdateTime())
                .build());
    }
}
